import { reactive } from 'vue';
import Request from '@/api/request/request';
import { ElMessage } from 'element-plus';

/**
 * 下载文件
 * @param blob 文件的二进制流
 * @param fileName  文件名
 */
export function downloadBlob(blob:Blob, fileName:string) {
  // 方法一:创建链接对象，然后下载。优点是可以自定义下载名称
  const elink = document.createElement('a');
  elink.download = fileName; // 下载文件名称
  elink.style.display = 'none'; // 不在页面显示这个链接
  elink.href = URL.createObjectURL(blob);
  document.body.appendChild(elink);
  elink.click();
  URL.revokeObjectURL(elink.href);// 释放URL 对象
  document.body.removeChild(elink); // 移除这个链接
  // 方法二：也可以下载，但是无法修改文件名，下载文件名是随机的UUID名称
  // let blob = new Blob([resData], { type: 'application/vnd.ms-excel' }); // res 就是文件流了
  // let objectUrl = URL.createObjectURL(blob);
  // window.location.href = objectUrl;
}

/**
 * 下载文件
 * 说明：
 * 1.如果resData是二进制流，则执行下载
 * 2.如果resData不是二进制，则根据业务需求判定是json字符串，此时显示错误信息并终止下载。
 * @param resData 文件的二进制流或是json类型的数据（一般在获取二进制数据错误时出现）
 * @param fileName  文件名
 */
export function downloadFromData(resData:any, fileName:string) {
  if (Object.prototype.toString.call(resData) === '[object Blob]') { // 先判断是不是blob格式
    if (resData.type.includes('application/json')) { // 判断是不是特殊情况(json)
      let reader = new FileReader();
      reader.onload = function () {
        const res = reader.result; // 获取返回的json字符串
        const data = JSON.parse(res as string); // blob格式转成json变量
        if (data.success === false) { // 如果服务端返回的是错误数据
          if (typeof data.msg === 'string') { // 如果有返回错误信息
            ElMessage({
              message: data.msg,
              grouping: true,
              type: 'error',
            });
          }
        }
      };
      reader.readAsText(resData); // readAsText 方法可以将 Blob 或者 File 对象转根据特殊的编码格式转化为内容 (字符串形式)
    } else { // 如果是blob格式
      const blob = new Blob([resData]);
      // 下载文件
      downloadBlob(blob, fileName);
    }
  }
}

export async function downloadFromUrl(url:string, param:Record<string, any>, fileName:string) {
  // 从服务端下载数据
  const resData = await new Request(url, null, { responseType: 'blob', params: param }).get();
  // 下载文件或弹出错误信息
  downloadFromData(resData, fileName);
}
